package com.util;

import com.sun.mail.util.MailSSLSocketFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import java.util.List;
import java.util.Properties;
import javax.mail.*;
import javax.mail.internet.*;
/**
 * @author linyukun
 * @date 2022/10/12 19:00
 */
public class MailUtils {
    private static Logger logger = LoggerFactory.getLogger(MailUtils.class);


    public static InternetAddress[] getInternetAddress(List<String> mailList) throws AddressException {
        int length=mailList.size();
        if (length == 0) {
            return null;
        }
        InternetAddress[] internetAddresses = new InternetAddress[length];
        for (int i = 0; i < length; i++) {
            internetAddresses[i]=new InternetAddress(mailList.get(i));
        }
        return internetAddresses;
    }

    /**
     * 发送短信
     * @param host 发件服务器地址
     * @param from 发送人
     * @param to 收件人
     * @param subject 标题
     * @param content 发送的内容
     * @param user 用户名
     * @param pwd 密码
     * 需要使用465端口 不然不给通过正式
     */
    public static void sendByAccountAndPwd(String host, String from, List<String> to, String subject, String content, String user, String pwd){

        Properties props = new Properties();
        // 设置发送邮件的邮件服务器的属性
        props.put("mail.smtp.host", host);
        props.put("mail.smtp.auth", "true");
        props.setProperty("mail.debug", "true");
        props.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
        props.setProperty("mail.smtp.socketFactory.fallback", "false");
        props.setProperty("mail.smtp.port", "465");
        props.setProperty("mail.smtp.socketFactory.port", "465");
        // 用刚刚设置好的props对象构建一个session
        Session session = Session.getDefaultInstance(props);
        session.setDebug(true);
        MimeMessage message = new MimeMessage(session);
        try {
            // 加载发件人地址
            message.setFrom(new InternetAddress(from));
            // 加载收件人地址 多个
            message.addRecipients(Message.RecipientType.TO, getInternetAddress(to));
            // 加载标题
            message.setSubject(subject);
            message.setContent(content, "text/html;charset=UTF-8");
            // 发送邮件
            Transport transport = session.getTransport("smtp");
            // 连接服务器的邮箱
            //transport.connect(host, user, pwd);
            transport.connect(host, user, pwd);
            // 把邮件发送出去
            transport.sendMessage(message, message.getAllRecipients());
            transport.close();
        } catch (Exception e) {
            logger.error(e.getMessage());
            e.printStackTrace();
        }
    }

    /**
     * 带附件
     * @param host 发件服务器地址
     * @param from 发送人
     * @param to 收件人
     * @param subject 标题
     * @param content 发送的内容
     * @param filePath 附件的路径
     * @param user 用户名
     * @param pwd 密码
     */
    public static void sendMultipartByAccountAndPwd(String host,String from,String to,String subject,String content,String filePath,String user,String pwd){
        Properties props = new Properties();
        // 设置发送邮件的邮件服务器的属性
        props.put("mail.smtp.host", host);
        props.put("mail.smtp.auth", "true");
        // 用刚刚设置好的props对象构建一个session
        Session session = Session.getDefaultInstance(props);
        session.setDebug(true);
        MimeMessage message = new MimeMessage(session);
        try {
            // 加载发件人地址
            message.setFrom(new InternetAddress(from));
            // 加载收件人地址
            message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
            // 加载标题
            message.setSubject(subject);
            // 向multipart对象中添加邮件的各个部分内容，包括文本内容和附件
            Multipart multipart = new MimeMultipart();

            // 设置邮件的文本内容
            BodyPart contentPart = new MimeBodyPart();
            contentPart.setText(content);
            multipart.addBodyPart(contentPart);
            // 添加附件
            BodyPart messageBodyPart = new MimeBodyPart();
            DataSource source = new FileDataSource(filePath);
            // 添加附件的内容
            messageBodyPart.setDataHandler(new DataHandler(source));
            // 添加附件的标题
            // 这里很重要，通过下面的Base64编码的转换可以保证你的中文附件标题名在发送时不会变成乱码
            sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
            messageBodyPart.setFileName("=?GBK?B?"
                    + enc.encode(filePath.getBytes()) + "?=");
            multipart.addBodyPart(messageBodyPart);

            message.setContent(multipart);
            // 发送邮件
            Transport transport = session.getTransport("smtp");
            // 连接服务器的邮箱
            transport.connect(host, user, pwd);
            // 把邮件发送出去
            transport.sendMessage(message, message.getAllRecipients());
            transport.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    /**
     * 发送短信通过授权尼玛
     * @param host 发件服务器地址
     * @param from 发送人
     * @param to 收件人
     * @param subject 标题
     * @param content 发送的内容
     * @param authorizationCode 授权码
     */
    public static void sendByAccountAndAuthorizationCode(String host,String from,String to,String subject,String content,String authorizationCode){
        Properties prop = new Properties();
        prop.setProperty("mail.host", host);  //设置QQ邮件服务器
        prop.setProperty("mail.transport.protocol", "smtp"); // 邮件发送协议
        prop.setProperty("mail.smtp.auth", "true"); // 需要验证用户名密码

        // 关于QQ邮箱，还要设置SSL加密，加上以下代码即可
        try{
            MailSSLSocketFactory sf = new MailSSLSocketFactory();
            sf.setTrustAllHosts(true);
            prop.put("mail.smtp.ssl.enable", "true");
            prop.put("mail.smtp.ssl.socketFactory", sf);
            //使用JavaMail发送邮件的5个步骤
            //创建定义整个应用程序所需的环境信息的 Session 对象
            Session session = Session.getDefaultInstance(prop, new Authenticator() {
                public PasswordAuthentication getPasswordAuthentication() {
                    //发件人邮件用户名、授权码
                    return new PasswordAuthentication(from, authorizationCode);
                }
            });
            //开启Session的debug模式，这样就可以查看到程序发送Email的运行状态
            session.setDebug(true);
            //2、通过session得到transport对象
            Transport ts = session.getTransport();
            //3、使用邮箱的用户名和授权码连上邮件服务器
            ts.connect(host, from, authorizationCode);
            //4、创建邮件
            //创建邮件对象
            MimeMessage message = new MimeMessage(session);
            //指明邮件的发件人
            message.setFrom(new InternetAddress(from));
            //指明邮件的收件人，现在发件人和收件人是一样的，那就是自己给自己发
            message.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
            //邮件的标题
            message.setSubject(subject);
            //邮件的文本内容
            message.setContent(content, "text/html;charset=UTF-8");
            //5、发送邮件
            ts.sendMessage(message, message.getAllRecipients());
            ts.close();
        } catch (Exception e) {

            e.printStackTrace();
        }

    }



}
